package com.qyer.hive.udf;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by zhaoxiang on 2017/5/26.
 */
public class SolutionOne {

    private static Object t = new Object();

    //volatile 变量 ，也可以用Atomac原子变量, ReentrantLock和条件变量Condition来实现
    // state==1表示线程1开始打印，state==2表示线程2开始打印
    private static volatile int state = 1;

    private static AtomicInteger c = new AtomicInteger(1);

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (c.get() < 100) {
                    synchronized (t) {
                        // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
                        while (state != 1) {
                            try {
                                t.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println(Thread.currentThread().getName() + " - " + c.getAndIncrement());
                        // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
                        state = 2;
                        // notifyAll()方法唤醒在t上wait的线程2
                        t.notifyAll();
                    }
                }
            }

        }, "Printer1").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (c.get() < 100) {
                    synchronized (t) {
                        // 如果state!=2, 说明此时尚未轮到线程2打印
                        while (state != 2) {
                            try {
                                t.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println(Thread.currentThread().getName() + " - " + c.getAndIncrement());
                        // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
                        state = 1;
                        // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
                        t.notifyAll();
                    }

                }
            }
        },"Printer2").start();
    }





    //
    ///**
    // * 大文件映射成小文件
    // * @param ipFile
    // * @param numberOfFile
    // */
    //public void splitFile(File ipFile,int numberOfFile){
    //    Map<Integer, Writer > bwMap = Maps.newHashMap();
    //    BufferedReader br = null;
    //    FileReader fr = null;
    //    BufferedWriter bw = null;
    //    FileWriter fw = null;
    //    try{
    //        fr = new FileReader(ipFile);
    //        br = new BufferedReader(fr);
    //        String ipLine = br.readLine();
    //        // 读取文件 映射到小文件
    //        while(ipLine != null){
    //            int hashCode = ipLine.hashCode();
    //            hashCode = hashCode < 0 ? -hashCode : hashCode;
    //            int fileNum = hashCode % numberOfFile;
    //            File file = new File("ip/"+ fileNum + ".txt");
    //            // 文件不存在 创建
    //            if(!file.exists()){
    //                file.createNewFile();
    //                fw = new FileWriter(file,true);
    //                bw = new BufferedWriter(fw);
    //                bwMap.put(fileNum, bw);
    //            }else{
    //                bw = bwMap.get(fileNum);
    //            }
    //            bw.write(ipLine + "\n");
    //            bw.flush();
    //            ipLine = br.readLine();
    //        }
    //        // 关闭输出流
    //        for(int fn : bwMap.keySet()){
    //            bwMap.get(fn).close();
    //        }
    //    }catch (Exception e) {
    //        e.printStackTrace();
    //    }finally{
    //        try{
    //            closeStreams(br);
    //        }catch (Exception e) {
    //            e.printStackTrace();
    //        }
    //    }
    //}
    //
    //
    //
    ///**
    // * 统计，找出每个小文件次数最多的IP
    // * @param ipFile
    // */
    //public void read(File ipFile){
    //    int maxNum = 0;
    //    Map<String,Integer> ipNumMap = Maps.newHashMap();
    //    List<String> ipList = Lists.newArrayList();
    //
    //    BufferedReader br = null;
    //    FileReader fr = null;
    //    try{
    //        fr = new FileReader(ipFile);
    //        br = new BufferedReader(fr);
    //        String ipLine = br.readLine();
    //        while(ipLine != null){
    //            ipLine = ipLine.trim();
    //            Integer count = ipNumMap.get(ipLine);
    //            if(count == null){
    //                count = 0;
    //            }
    //            count ++;
    //            ipNumMap.put(ipLine, count);
    //
    //            if(count >= maxNum){
    //                if(count > maxNum){
    //                    ipList.clear();
    //                }
    //                ipList.add(ipLine);
    //                maxNum = count;
    //            }
    //            ipLine = br.readLine();
    //        }
    //    }catch (Exception e) {
    //        e.printStackTrace();
    //    }finally{
    //        try{
    //            closeStreams(br);
    //            // 将最大IP 及频率输出到文件
    //            writeMaxIPListToFile(ipFile);
    //        }catch (Exception e) {
    //            e.printStackTrace();
    //        }
    //    }
    //}



}
